package com.pattern.singleton.lazy;

/**
 * Description 静态内部类单例模式
 * 优点：全程没有使用synchronized关键字，性能得到了提高
 * 缺点：虽然private私有的构造方法能够避免new实例化 但是没办法解决反射的暴力实例化
 *
 * @author hubiao
 * @since 2020-08-20 20:42
 */
public class LazyInnerClassSingleton {

    /**
     * 1.声明私有构造方法 使类不能被 new创建
     */
    private LazyInnerClassSingleton() {
        //防止暴力反射获取多个对象
        if (LazyHolder.lazyInnerClassSingleton != null) {
            throw new RuntimeException( "单例模式不能创建多个实例" );
        }
    }

    /**
     * 2.提供一个全局的访问点
     * 注意：LazyHolder里面的逻辑只有在被外部调用的时候才会执行
     * 使用JVM底层的逻辑完美的避免了线程安全性问题
     */
    public static LazyInnerClassSingleton getInstance() {
        return LazyHolder.lazyInnerClassSingleton;
    }

    private static class LazyHolder {
        //饿汉式的写法
        private static final LazyInnerClassSingleton lazyInnerClassSingleton = new LazyInnerClassSingleton();
    }

}
